Walking the References

Linked List Updates


노드 자체를 옮기지 않고 연결만 바꾸는 것이 핵심이다. 다만 위치를 찾는 비용과 참조를 바꾸는 비용은 구분해야 한다.

연결만 바꾸기노드를 옮기지 않고 next 참조를 바꾼다.
대입 순서맨 앞 삽입은 X.next = head를 먼저 해야 기존 노드를 잃지 않는다.
비용 나누기위치를 찾는 Θ(1+i)와 참조를 바꾸는 Θ(1)을 구분한다.

맨 앞 삽입에서는 새 노드의 next를 먼저 연결해야 한다

삽입은 자리를 찾는 일(Θ(1+i))과 참조 두 개를 고치는 일(Θ(1))로 나뉜다. 두 대입의 순서를 바꾸면 맨 앞 삽입에서만 기존 노드로 가는 참조가 사라진다.

연결리스트 삽입새 노드 X를 삽입하며 참조를 바꾸는 과정
원은 노드, 회색 화살표는 기존 next, 초록 화살표는 이번에 바꾼 참조다. 초록 원 X는 새 노드이며, 빨간 글자는 도달할 수 없게 된 노드를 알린다. 아래 코드 칸에서 짙은 칸이 방금 실행한 줄이다.
현재 상태
실행 단계

기존 노드를 가리키는 참조가 하나뿐이면 그 참조를 바꾸기 전에 새 노드의 next를 먼저 연결한다.

삭제는 앞 노드의 next를 삭제할 노드의 다음 노드로 바꾼다

중간 노드를 삭제할 때는 앞 노드의 next가 삭제할 노드의 다음 노드를 가리키게 한다. 첫 노드는 앞 노드가 없으므로 head를 직접 바꾼다. 끝 노드를 지우면 tail도 앞 노드로 옮기고, 어느 경우든 n을 1 줄인다.

연결리스트 삭제삭제 위치를 찾고 앞뒤 연결을 잇는 과정
초록 화살표와 글자는 바뀐 연결, 빨간 점선 원은 목록에서 빠진 노드다. 노드 아래 tail은 마지막 노드를 가리키는 참조다. 아래 코드 칸에서 짙은 칸이 실행한 줄이다.
현재 상태
삭제 위치 찾기
참조 변경
원소 수

참조와 n을 고치는 일은 Θ(1)이지만, i번째 노드를 삭제하려면 그 위치까지 순회해야 하므로 전체 비용은 Θ(1+i)이다. 정리하면 순회 Θ(n), 탐색 최악 Θ(n), 맨 앞 삽입 Θ(1), i에 삽입과 i에서 삭제는 Θ(1+i)다.